perm filename UDPEDT.FAI[KID,KMC] blob sn#122898 filedate 1974-11-15 generic text, type T, neo UTF8
TITLE UDPEDT;   THIS PROGRAM ALTERS THE UDP DIRECTORY BY OVERWRITING
;		NOMINATED WORDS ACCORDING TO A PRESCRIPTION GIVEN IN
;		THE TABLE 'EDITS'.
;
;		RECALL THAT THE DIRECTORY OCCUPIES 1 BLOCK AND THIS
;		HAS BLOCK NUMBER GIVEN BY `PAKST'.
;
;		RECALL ALSO THAT THE FORMAT OF THE UDP DIRECTORY IS :-
;		  WORD 0 - NUMBER OF ENTRIES;
;		  WORD 1 - DATE OF LAST CHANGE ON UDP;
;		  WORD 2 - NEXT FREE BLOCK NUMBER;
;		  WORD 3 - JUNK
;		  WORD (2N+2) - NAME OF nTH ENTRY;
;		  WORD (2N+3)LO - BLOCK ADDRESS OF nTH ENTRY;
;		  WORD (2N+3)HI - LENGTH (WORDS) OF nTH ENTRY.
;
;		EACH EDIT SPECIFICATION IS A TRIPLET OF WORDS:-
;		  THE FIRST IS THE ADDRESS OF THE WORD TO BE CHANGED;
;		  THE SECOND IS THE OLD CONTENTS OF THE WORD;
;		  THE THIRD IS THE NEW CONTENTS OF THE WORD.
;
;		THIS PROGRAM CAN ONLY BE USED TO EDIT WORDS IN THE
;		DIRECTORY BLOCK OF A UDP AND WILL ONLY DO SO IF
;		ALL THE SPECIFICATIONS OF `OLD CONTENTS' PROVE CORRECT.
;
;		AS AN ADDITIONAL CHECK THE USER MUST DECLARE THE NUMBER
;		OF TRIPLETS HE INTENDS TO SUPPLY.
;
;		ONLY CHANGE A COPY OF THIS PROGRAM.
;
;		THE PROGRAM ALTERS WORD 1 TO CURRENT DATE BEFORE
;		ANY OTHER WORD IN DIRECTORY IS CHANGED.
;

A ← 1
B ← 2
C ← 3
CPLUS1 ← 4
D ← 5
P ← 6
ABY3 ←7
UDPCHN ←← 1
PAKST ←← 1

DIRECT:	BLOCK =2336
PDL:	BLOCK =10
FAILS:  0   ;SET NONZERO BY FAILURES.

EDITS:
;DECLARE THE TRIPLETS HERE.
EDEND:	0
NUMBER: 0 ;YOU MUST  CHANGE THIS TOO.


START:	;START BY INITing THE UDP
	INIT	UDPCHN,17
	SIXBIT	/UDP/
	0
	JRST	[OUTSTR [ASCIZ /CANNOT INIT UDP/]
		 CALL   [SIXBIT /EXIT/]]

	ENTER	UDPCHN,[SIXBIT /KMC/
			0
			0
			0]
	JRST	[OUTSTR [ASCIZ /CURRENT PAK PROTECTED/]
		 CALL [SIXBIT /EXIT/]]

	MOVE	P,[IOWD 5,PDL]

	MOVEI	A,EDEND-EDITS
	CAIN	A,0			;TEST FOR EDEND=EDITS
	JRST	[OUTSTR [ASCIZ /YOU MISPLACED YOUR EDIT TRIPLETS/]
		 CALL [SIXBIT /EXIT/]]

	SKIPN	NUMBER			;TEST NUMBER
	JRST	[OUTSTR [ASCIZ /YOU DID NOT CHANGE NUMBER/]
		 CALL [SIXBIT /EXIT/]]

	MOVE	A,NUMBER		;NUMBER OF WORDS TO CHANGE
	IMULI	A,3
	CAIE	A,EDEND-EDITS		;TEST NUMBER FOR CORRECTNESS.
	JRST	[OUTSTR [ASCIZ /COUNT YOUR EDITS AGAIN/]
		 CALL [SIXBIT /EXIT/]]

	;NOW READ THE UDP DIRECTORY BLOCK.
	IN	UDPCHN,[IOWD =2336,DIRECT
			PAKST]
	JRST	.+2
	JRST	[OUTSTR [ASCIZ /ERROR ON READING UDP/]
		 CALL [SIXBIT /EXIT/]]

	CALL	A,[SIXBIT /DATE/]
	MOVE	A,DIRECT+1		;UPDATE THE DATE

	MOVEI	A,0			;PREPARE TO LOOP
	MOVEI	ABY3,0
LOOP:	;THIS IS THE START OF THE MAIN LOOP
	CAMN	A,NUMBER
	JRST	LOOPX			;ESCAPE LOOP

	MOVE	B,EDITS(ABY3)		;WORD 1 OF TRIPLET - ADDRESS.
	CAIGE	B,0			;TEST FOR NEG ADDR.
	JRST	[MOVEI B,[ASCIZ /WORD 1 NEGATIVE./]
		 JRST  ALLFAILS]

	CAIL	B,=2336			;TEST FOR ADDRESS BEYOND 1 BLOCK
	JRST	[MOVEI B,[ASCIZ /WORD 1 TOO LARGE./]
		 JRST  ALLFAILS]

	MOVE	C,EDITS+1(ABY3)		;PREDICTED OLD CONTENTS.
	CAME	C,DIRECT(B)		;CHECK OLD CONTENTS
	JRST	[MOVEI B,[ASCIZ /OLD CONTENTS NOT AS PREDICTED./]
		 JRST  ALLFAILS]

	MOVE	C,EDITS+2(ABY3)		;PRESCRIBED NEW CONTENTS.
	MOVEM	C,DIRECT(B)		;MAKE THE CHANGE

QWERTY:	ADDI	A,1			;BUMP LOOP COUNTER
	ADDI	ABY3,3			;ADJUST THIS TOO
	JRST	LOOP

ALLFAILS:;A FAILURE HAS BEEN DETECTED IN A TRIPLET.
	OUTSTR	[ASCIZ /A FAILURE WAS DETECTED IN TRIPLET /]
	MOVE	C,A			;COPY TRIPLET NUMBER
	MOVEI	D,=1000
	CAIL	C,=1000			;PRINT NO THSDS DGT IF 0
	PUSHJ	P,DIGIT			;PRINT THOUSANDS
	MOVEI	D,=100
	PUSHJ	P,DIGIT			;PRINT HUNDREDS
	MOVEI	D,=10
	PUSHJ	P,DIGIT			;PRINT TENS
	MOVEI	D,=1
	PUSHJ	P,DIGIT			;PRINT UNITS
	MOVEI	C,12
	OUTCHR	C			;PUT OUT A LF CHAR.
	MOVEI	C,15
	OUTCHR	C			;PUT OUT A CR CHAR.
	HRRM	B,.+1
	OUTSTR	0			;VARIOUS MESSAGES
	MOVEI	C,12
	OUTCHR	C			;PUT OUT A LF CHAR.
	MOVEI	C,15
	OUTCHR	C			;PUT OUT A CR CHAR.
	SETOM	FAILS			;RECORD FACT OF ERRORS.
	JRST	QWERTY

LOOPX:	;THE LOOP FINISHED
	SKIPE	FAILS			;JUMP IF NO FAILURES
	JRST	[OUTSTR [ASCIZ /DIRECTORY NOT REWRITTEN (FAILURES)./]
		 CALL	[SIXBIT /EXIT/]]
	OUT	UDPCHN,[IOWD =2336,DIRECT
			PAKST]
	JRST	.+2
	JRST	[OUTSTR [ASCIZ	/ERROR ON UDP WRITE/]
		 CALL [SIXBIT /EXIT/]]

	RELEAS	UDPCHN
	CALL	[SIXBIT /EXIT/]


DIGIT:	;THIS S/R IS TO MAKE INTEGER PRINTING EASY
	;IT PRINTS THE DIGIT OF THE NMBER IN C  CORRESPONDING
	;TO THE RADIX GIVEN IN D AND REMOVES THE DIGIT FROM C.
	;THE ROUTINE USES REGISTER CPLUS1 FOR DIVISIONS (CPLUS1=C+1).
	IDIV	C,D			;GET QUOT AND REMNDR.
	ADDI	C,060			;CONVERT TO DIGIT
	OUTCHR	C			;PRINT DIGIT
	MOVE	C,CPLUS1		;THAT DIGIT IS REMOVED
	POPJ	P,

	END	START